{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本文内容是对 [Hands-on Machine Learning with Scikit-Learn and TensorFlow](http://shop.oreilly.com/product/0636920052289.do) 这本书的第三章的实践，这一章讲了在分类任务中，评估分类效果的种种策略。\n",
    "\n",
    "## 下载数据集\n",
    "\n",
    "首先先下载数据集。sklearn 通过网络下速度极慢，可以手动去其他地方（比如[这里](https://raw.githubusercontent.com/amplab/datascience-sp14/master/lab7/mldata/mnist-original.mat)）下载对应文件，然后放到 `~/$HOME/scikit_learn_data/mldata/` 目录下。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "\n",
    "# https://raw.githubusercontent.com/amplab/datascience-sp14/master/lab7/mldata/mnist-original.mat\n",
    "mnist = fetch_mldata('MNIST original')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((70000, 784), (70000,))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = mnist['data'], mnist['target']\n",
    "X.shape, y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个数据集中包含 70000 张手写数字，每张图片的分辨率为 `28*28`。每张图片有一个对应了 label 指出该图片对应的数字。\n",
    "\n",
    "## 观察样本\n",
    "\n",
    "随便挑出一些样本进行观察。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# EXTRA\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "plt.figure(figsize=(6,6))\n",
    "example_images = X[0:70000:700]\n",
    "plot_digits(example_images, images_per_row=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 划分训练集和测试集\n",
    "\n",
    "这里取了前 6 万个样本做训练集，为了方式对应相同的数字样本连续出现，要将样本打乱。下面的步骤完全可以使用 sklearn 中的 `train_test_split` 来完成。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]\n",
    "\n",
    "# 把训练集的顺序打乱，防止同种标签的样本连续出现\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train = X_train[shuffle_index]\n",
    "y_train = y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练二分类分类器\n",
    "\n",
    "样本中包含 0~9 共 10 类样本，但此处先训练一个二分类分类器，用来区分 5 和其他数字。\n",
    "\n",
    "为此需要把标签修改为 0 或 1，0 对应非数字 5， 1 对应数字 5。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_5 = (y_train == 5)\n",
    "y_test_5 = (y_test == 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里使用 `SGDClassifier` 分类器，`SGDClassifier` 的做法是将样本属性值线性加权求和，当和大于某个阈值时为正例，否则为反例。它在不断迭代中，利用误差采用随机梯度下降的方式更新权重。\n",
    "\n",
    "使用此分类器，可以设置一个迭代次数，当迭代次数到了后，停止训练，但是往往事先并不知道需要迭代多少次。另一种方法是设置参数 tol，即 tolerance，当两次迭代之间 loss 减少量低于 tol 时训练结束。为了避免迭代次数过多，可以设置 `max_iter` 参数，限制最大迭代次数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDClassifier(alpha=0.0001, average=False, class_weight=None,\n",
       "       early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,\n",
       "       l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=500,\n",
       "       n_iter=None, n_iter_no_change=5, n_jobs=None, penalty='l2',\n",
       "       power_t=0.5, random_state=42, shuffle=True, tol=0.01,\n",
       "       validation_fraction=0.1, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state=42, max_iter=500, tol=0.01)\n",
    "sgd_clf.fit(X_train, y_train_5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试分类器性能\n",
    "\n",
    "对分类效果的评估有很多种指标。\n",
    "\n",
    "### 1. 使用交叉验证来测试性能\n",
    "\n",
    "在评估机器学习算法的效果时，要用到为参与训练的样本来测试算法的效果。测试数据一般不应该参与到模型的选择中，因为使用测试数据来改进算法导致的结果是，学习到的模型较契合于测试集。\n",
    "测试数据只应该用于模型确定之后，来估计泛化误差，不应该参与到用于改进模型中。\n",
    "\n",
    "使用交叉验证，在每次训练中，从原训练集分出训练集和验证集，使用分出来的训练集来训练模型，使用验证集来在分类器上得出分类准确率、召回率等指标。这样在 K 折交叉验证中，能得到 K 组指标，与仅有一组测试指标相比，观察这 K 组指标能够得出更加可信的结论。\n",
    "\n",
    "为了评估模型的效果，需要从训练集中划分出一个验证集。当数据量很少的时候，训练数据本就很小，划分出的验证集自然也不能很大。在一个小的验证集上得到的结果就显得不那么可靠。k 折交叉验证将数据分为 K 份，每次使用 K-1 份数据作为训练集，使用余下的 1 份作为验证集。这样训练 K 的模型，验证 K 次，最后求出 K 个评估指标的均值，作为最终评估结构。\n",
    "\n",
    "![<width,400px>](https://wangyu-name.oss-cn-hangzhou.aliyuncs.com/superbed/2019/05/07/5cd0f9253a213b0417e34cf2.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.9642666666666667, 0.9664666666666667, 0.963, 0.9132]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.model_selection import KFold\n",
    "\n",
    "acc_list = []\n",
    "kf = KFold(n_splits=4)\n",
    "\n",
    "for train_index, val_index in kf.split(X_train):\n",
    "    partial_X_train = X_train[train_index]\n",
    "    partial_y_train = y_train_5[train_index]\n",
    "\n",
    "    X_val = X_train[val_index]\n",
    "    y_val = y_train_5[val_index]\n",
    "    \n",
    "    sgd_clf = SGDClassifier(random_state=42, max_iter=500, tol=0.01)\n",
    "    sgd_clf.fit(partial_X_train, partial_y_train)\n",
    "    \n",
    "    y_pred = sgd_clf.predict(X_val)\n",
    "    acc = accuracy_score(y_val, y_pred)\n",
    "    \n",
    "    acc_list.append(acc)\n",
    "    \n",
    "print(acc_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实际项目中，可以使用 sklearn 中的 `cross_val_score` 来进行交叉验证，比起自己实现 K 折交叉验证，此函数还可以多进程执行。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.95700287, 0.96053333, 0.96806667, 0.95273018])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=4, scoring=\"accuracy\", n_jobs=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "准确度 (accuracy)，表示在所有样本中，被预测正确的样本的占比。这里 accuracy 达到了 97% 左右，看似很喜人的结果，但事实并非如此。\n",
    "\n",
    "因为样本中正例（数字5）和反例（非数字5）的比例是 1:9，因此分类器只需要对所有待测样本均输出 0（认为该样本不是数字5），也能得到 90% 的准确度。所以在这个场景下 accuracy，就没有很大的参考意义。\n",
    "    \n",
    "accuracy 在分类问题中往往不能很好地体现分类器的性能，尤其是在样本分布不均匀的情况下。\n",
    "\n",
    "### 2. 使用 confusion matrix\n",
    "\n",
    "confusion matrix 用来观察分类的具体细节，能够看出各个类别样本都被分到了那些类别，以及占比如何。因此，需要对某些样本进行预测，并与其真实的标签对比。\n",
    "\n",
    "使用 `cross_val_predict` 可以在交叉验证的每一折中，对验证集进行预测，进而得出对整个训练集的预测。因为在交叉验证中，一部分训练集被抽出来作为验证集，因此交叉验证的每一折，都可以得出部分训练集的预测结果。利用预测结果与训练集真实的样本标签比较，可以得到 confusion matrix。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53256,  1323],\n",
       "       [ 1214,  4207]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=5,  n_jobs=-1)\n",
    "\n",
    "\n",
    "from sklearn.metrics import confusion_matrix\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "confusion matrix 中第 n 行 m 列的元素，表示第 n 类被预测为第 m 类的数量。因此对角线上的元素越大越好，非对角线上的元素越接近 0 越好。\n",
    "\n",
    "### 3. 精度和召回率 / precision and recall\n",
    "\n",
    "这里的精度和前面的 accuracy 不同，**precision** 表示在预测为真的样本中，实际确实为真的样本的占比。因此，如果要提高 precision，可以只对那些有非常大的把握认为是正例的样本预测为正。追求高精度，也就是强调结果的可靠性、准确性。可以漏掉一些正例，但一旦认为某些样本是正例，那就得有很大把握才是。\n",
    "\n",
    "**召回率**表示预测结果中，预测正确的正例占所有正例的比例。即所有正例中有多少被真真切切地找出来了，指被预测为正的正例占所有正例的比例。为了提高召回率，可以认为所有样本都是正例，这样召回率就为 1，不过此时精度也就下降了，因为有大量不是正例的样本被认为是正例。\n",
    "\n",
    "```\n",
    "precision = TP / (TP + FP)\n",
    "\n",
    "recall = TP / (TP + FN)\n",
    "```\n",
    "\n",
    "\n",
    "可以看出，实际项目中在 precision 和 recall 之间需要权衡，两者中一个升高，另一个就要降低。\n",
    "\n",
    "\n",
    "```\n",
    "F1 = 2 * precision * recall / (precision + recall)\n",
    "```\n",
    "\n",
    "F1 是 precision 和 recall 的调和平均数，F1 指标将 precision 和 recall 综合起来，只有 precision 和 recall 都具有较大的值时，F1 的值才会大。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.760759493670886, 0.7760560782143516, 0.7683316592092047)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score, f1_score\n",
    "\n",
    "(\n",
    "    precision_score(y_train_5, y_train_pred),\n",
    "    recall_score(y_train_5, y_train_pred),\n",
    "    f1_score(y_train_5, y_train_pred)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. precision and recall 曲线\n",
    "\n",
    "某些时候，希望预测结果能有较高的 precision 或者 recall，这需要改变分类器给样本分类的策略。通常分类器是根据样本的属性值采用某种策略（比如加权求和）得出一个值（信心指数，confidence scores），当此值大于某个阈值 (threshold) 的时候认为样本是正例，否则认为是反例。要想提高 precision 或者 recall 中的某一个指标，只需要调整这个阈值即可。\n",
    "\n",
    "比如提高 threshold 意味着当分类器十分确信的时候，才会将样本分为正例，如此就能提高 precision。相反，降低 threshold 就能够提高 recall。\n",
    "\n",
    "要设置这个 threshold 需要知道相应的 threshold 的各个值下对应的 precision 和 recall 分别为多少。一个方法是让分类器返回对各个样本的 confidence scores，拿一个 threshold 和各个样本的 confidence scores 比较，就能得出此 threshold 下的 precision 和 recall。如此不断调大 threshold 就可以知道各个 threshold 对应的 precision 和 recall 了。\n",
    "\n",
    "通过调用分类器上的 `decision_function` 方法可以返回各个样本的 `confidence scores`："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-24932.63544288, -21166.8907727 , -18782.37112855, -10649.15697538,\n",
       "       -12859.27399089, -34093.24186857, -20045.6491261 , -13236.36453865,\n",
       "       -16931.29933201, -19374.46421172])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = sgd_clf.decision_function(X_train[0:10])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以使用交叉验证来对训练集中各个样本得出 `confidence scores`\n",
    "\n",
    "前面提到过 `cross_val_predict` 能够用来得出模型对训练集的预测结果，但此时我们不让它输出预测的分类标签，而是让它输出 `confidence scores`。`method` 参数是指在传入的 estimator，即分类器，上调用 `method` 指定的方法，并作为预测结果返回。这里需要得到样本的 `confidence scores` 因此传入 `method=\"decision_function\"`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=5, method=\"decision_function\", n_jobs=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用各个样本的 confidence scores 和 标签，可以使用 `precision_recall_curve` 这个函数来得出各个 threshold 下的 recall 和 precision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((59944,), (59944,), (59943,))"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)\n",
    "\n",
    "(precisions.shape, recalls.shape, thresholds.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "需要注意的是 `precision_recall_curve` 这个函数返回三个值，分别为 `precisions`, `recalls`, `thresholds`，其中 `thresholds` 较 `precisions` 和 `recalls` 要少一个元素。\n",
    "\n",
    "有了 `precisions`, `recalls`, `thresholds` 就可以以 threshold 为横轴绘制出曲线，以此曲线来选取合适的 threshold 了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\")\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\")\n",
    "    plt.xlabel('Threshold')\n",
    "    plt.legend(loc=\"upper left\")\n",
    "    plt.ylim([0, 1])\n",
    "    \n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据图像可以很清楚地看出，如果要 recall 达到 90%，那么 threshold 大概需要为 -10000（具体需要仔细计算获得），因此可以将 confidence scores 大于 -10000 的样本的标签设为 1。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'precision': 0.32091511438929865, 'recall': 0.9470577384246449}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred_recall_90 = (y_scores > -10000)\n",
    "\n",
    "{\n",
    "    'precision': precision_score(y_train_5, y_train_pred_recall_90),\n",
    "    'recall': recall_score(y_train_5, y_train_pred_recall_90)\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "precision 和 recall 之间存在权衡，如果要确定两者的对应关系，可以直接以 precisions 和 recalls 为横纵轴，画出两者的变化关系："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", label=\"Precision\")\n",
    "    plt.xlabel('Recall')\n",
    "    plt.ylabel('Precision')\n",
    "    plt.xlim([0, 1])\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plot_precision_vs_recall(precisions, recalls)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过这个曲线，可以看出某个 recall 对应的 precision，以此来进行两者的权衡。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. ROC 曲线\n",
    "\n",
    "ROC (receiveroperating characteristic)，翻译过来为接收者操作特征，说实在的我还不知道这到底是个啥意思。\n",
    "\n",
    "要想提高召回率，那就尽可能多的样本分类为正例，但这也就会增加 FP（假正例）的量。ROC 曲线能够反映出召回率的上升和错分正例比率的关系。如果这条曲线与纵轴贴的很近，那说明不需要出现太多假正例，就能得到不错的召回率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl0FHW2wPHv7c5G2ARBZAcVlB0xsoiACCKLiiPIpiwi4MbTcUVHz+g4Ph0dZRxmXEDA7em4g+CgMG4gKAjIvgphCAFB9iVk6+77/qhOjDEkDaRT3Z37OacPXdXVVTdFUrfq96u6P1FVjDHGmBPxuB2AMcaYyGaJwhhjTLEsURhjjCmWJQpjjDHFskRhjDGmWJYojDHGFCtsiUJEpovIzyKy9gSfi4hMEpEtIrJaRNqFKxZjjDGnLpxXFK8BvYv5vA/QJPgaB7wUxliMMcacorAlClVdABwoZpH+wBvqWAycISK1wxWPMcaYUxPn4rbrAjsKTKcH5/1UeEERGYdz1UHFihUvuuCCC8okQGNMbFKFgCoKoKAUfA+qSkCdf3N8AUT41efBt8F1Kdm+AHEeQYHMHD8JXk+B5fRXX8ibn5njJ97rnKv7AgFy/AHiPc73cv2BUvtZfYd/JpCdAQH/PlWteSrrcDNRSBHziqwnoqpTgCkAKSkpumzZsnDGZYwpRFXxBZRcf4DjOX4yc/zk+gP4A8qRLB8+fwC/Kv6A8wqo8vORbOK8HgLB+b6AsutQZv7BMccXYO3Ow9SrViG4jHPwzls+1x9g7c4jNDwzmc17juL1CBUT49DgAVwJHuyV/HmBvIO+QkBh37FsABK8nvz4wiGxwPvKIX4n+STWH+cRfMHY61RNIs7rQVF+OpRFm/pnsO9YNg2qJ3PeWZWomBBHnEfYdyyb82tX4esZ/8exQwd4b8rE7SexyV9v/1S/WArSgfoFpusBu1yKxZiIlu3zk+0L4PM7B9Ajmbn4As7Z7t6j2cTHeYIHTSUQAH/ee807+MKOA8c5kpXLj3uOUTkpDl9A8fuV/+7PACAp3suWn48hQMVE53NfIMCh47mu/uw7D2UWmMo+pXXkFDhDF3EOvLl+58Bbs3IiHgGvCB6P4PUIHhG27csgpWE14r0eDmTk0KJuFWcZETwenH9F8ASvNo5k5tKkVmXiPMLRLB/1q1dARBD41Xck+B2PCJk5fuqcUYF4ryAC1ZITSIjzEO/1kBTnJTnRS5zH+U7I+2vnTm677TYGDx7MDR1vYHjHhwF4b8rEU9p34G6imAWMF5F3gA7AYVX9TbOTMZEqEFCOZvk4luPD73cOqv6AkpUb4MDxHHJ9AbJ9AdIOHKdSopccv7LxpyPUrJxIrj9Arl9ZEzyjzvUH2LT7KMkJccR7nbPHzBw/qfsywnYWXJyj2b4i51eIdw5cR7N9NDozmTivhziPsGnPUdo3qk6c1zl4xgUPuKl7M7iwQTVn2uvM3304i6a1KlMhwYtHhOM5PupVcw6qXnG+JwJej6DqHNRrVk5EBKpWSECE/IOvBA+4AB6Pc1DOm+e8d7ZZIcGbH9PJHHSjiaoydepU7rvvPnJzc+nXr1+prTtsiUJE/gVcBtQQkXTgUSAeQFVfBuYAfYEtwHHgpnDFYsqvvLPqo1m5ZOT4+flIFtm+AIFgU4hflT2Hs0iM95DrV7Jy/aTuzeDno1mk7s0INnU4y65OP0ytKokEFPYePbUz26Is334w5GXPSI4nzuPJb2o4Izken1/Zn5HNBWdXyT9TFRG8Bc56RZyD5r6j2TSqkcwZyQlccHZlErwevMFmjVpVEkmM8+L1CGckx+P1CHEe5/OkeA+Jcd5S+5lN6dq6dStjx47lq6++onv37rzyyiuce+65pbb+sCUKVR1awucK3BGu7Zvop6ocOp7L/owcjmTlsutQJl4RcvwBtu3LIDnBy+r0w+w4mEmFeA/pBzM5kpnLkSwfSfEefH7Nb9ctLXuOFJ0gGlRPxhs8Y43zCMkJXqolJxAfbKM/lu2jaa3KxHuFAxm5NKlViXivh3iv00zR6MyKxHud5pCzqiQSHzxT93qEOlUrUDkpDo8nNs+Ezelbs2YNy5cvZ8qUKYwZM6bUr5rcbHoyMSLvro/s3ABHsnLJ9gWCnZdO88q+o9kczswl/WAm+zOy2bYvg5qVEn/V+ekPKHuOZpPrC7B17zEAsn2nfudHVu4v3/WI07GZ4PVQr3oFpx04eCad9/rvvgzaNaxGvFcAwecPUL96Mo1rVKR21STnwO0VErweqlSIJ8HroUKCl6R4O8s27li7di0//PADI0aM4NprryU1NZUzzzwzLNuyRGFKpOq0u+/PyGbdriP8dCiTZdsPkpHtY+Puo/x0OCus26+cGMfRbB+t61Ulxxegaa3KxHmFXYcyaVmnKl6P0ODMZOpVS6buGUlUSoynaoX4/LN7OxM3sSQnJ4cnn3ySJ598klq1ajFo0CCSkpLCliTAEkW5lesPcDAjhz1Hstl3LJv9GTls3nOUiglxzFu/mypJ8azYcRCvCBk5/pDWWSXJuXXxaLaPprUq4fU4zScZ2T4S471UrRDHmZUSqVfNOauvVSUx2PHpyW9PFxEa10imZuUkKidac4sxBS1ZsoSbb76ZdevWceONN/K3v/2NpKSksG/XEkUMOpiRw5JtB5i3fjeHj+eybteR/GaT1H0Zv7onO1SJcR6yfQHOqVmRMyrE07reGTQ8M5kWdapyVuVE6gfb6I0x4bFz5066dOlCrVq1+OSTT0r1rqaSWKKIQoGAsnXvMZZtP8ianYdZkXaIXYcyOZwZ2v3uBZNEnEc4p2ZFmpxVmYqJXo7n+GlWuwpZuX4ualiNGpUSaVqrMglxVmjYGDds3ryZpk2bUrduXd5991169OhBlSpVyjQGSxQRSFVZlX6Y7fsz+OlwFv6A8tPhTD5Ynk5yQhwHMnJCWk+rulU5t2ZFLjm3BjUqJ9CgejKJcV6qVIi3Zh1jItyhQ4d44IEHmDp1Kl9//TVdu3bld7/7nSuxWKJwkc/v1HfJ8QXYcSCTzzfsYe663ew+knXCp2Gzcn+dJIa2r0+bemdQKSmOetXyHuH3xuxDRcaUB7NmzeK2225j9+7d3H///Vx88cWuxmOJogz5/AHmb97Lt1v3M23hthKXj/cKXZvUpH71ZKpWiCfeK9SuWoEuTWoEn1S1ZGBMrBkzZgzTpk2jVatWfPzxx6SkpLgdkiWKcFJ1nuZ947vtHDqewxcbfy5yucpJcRzN8lGjUiJ1zkji2rZ1GXRxfSol2n+PMeWB8/yx8/R8SkoKDRs2ZMKECSQkJLgcmcOORKUsK9fPnDU/sXLHId74ruhijRUTvNx/5fkMad/AHtgyppzbsWMHt956K0OGDGH48OHceuutbof0G5YoSsG2fRlMWbCV95elF3nb6XlnVaLzuWfSs3ktLj2vhjUZGWMIBAJMnjyZCRMm4Pf7XeuoDoUlitPw2dqfeHLORtIOHP/NZ+0bV+fmSxtz2fk1rZiaMeZXfvzxR8aMGcOCBQvo2bMnU6ZMoXHjxm6HdUKWKE6CqrJx91Fe//a//Gf9HvZnFL4DqQE3dmxA89pV7KrBGHNC69evZ/Xq1UyfPp1Ro0ZF/PHCEkUIfP4A7y9P56GP1vzms5Z1q/DisItocObJjFdljClvVq1axcqVKxk5ciT9+/cnNTWVatWquR1WSCxRlGDLz0fp9bcFFO56GNq+Aden1KNdg+j4jzbGuCM7O5snnniCv/zlL9SuXZvBgweTlJQUNUkCLFEU6XiOj3eX7uBPs9f/an77RtV58cZ21KiUeIJvGmPML7777jtuvvlmNmzYwIgRI5g4cWKZFPErbZYoCjmYkUP3577+1ZPR1Ssm8M64jjStFeqw6caY8m7nzp1069aNs88+mzlz5tCnTx+3QzplligKmDhvE5O+3JI/3a9Vbe7t1ZRzalZyMSpjTDTZsGEDzZo1o27durz33nv06NGDypWj+yTTSoIGPT57/a+SxLy7u/LCDe0sSRhjQnLw4EFGjx5N8+bN+eabbwC49tproz5JgF1RkJXr5973V/Hv1T8BcFHDarw1poM9MW2MCdmMGTO4/fbb2bt3Lw899JDrRfxKW7lOFFm5fno8N5+dhzIB+HP/Fgzv1MjdoIwxUWX06NG8+uqrtG3bln//+9+0a9fO7ZBKXblNFIczc2nzp3n505OGXsg1beq4GJExJloULOLXsWNHmjRpwn333Ud8fLzLkYVHuUwUWbl+Bk/+Ln968vCLuLLF2S5GZIyJFtu3b+eWW25h2LBhjBgxgnHjxrkdUtiVu87sHF+Avn//ho27j5IQ5+Hfd15qScIYU6JAIMALL7xAy5YtWbhwIbm5oQ09HAvK3RXFY7PXkbovA4C3x3SgRZ2qLkdkjIl0mzZtYsyYMSxcuJBevXoxefJkGjVq5HZYZaZcJYp3l6bx9pI0AP7Q9wJSGlV3OSJjTDTYtGkT69at47XXXmPEiBERX8SvtJWbRLF252EmfOgU9et0zpmM7XKOyxEZYyLZihUrWLlyJTfddBPXXHMNqampnHHGGW6H5Ypy0Uehqtz+1g8AXH7BWbw9tkO5OyMwxoQmKyuLP/zhD1x88cU89thjZGVlAZTbJAHlJFH87fMfSTtwnIQ4D08PaG1JwhhTpEWLFtG2bVueeuopRowYwcqVK6OyiF9pi/mmpwWb9zLpix8BeKRfM2pWtsqvxpjf2rlzJ927d6du3brMnTuXXr16uR1SxIjpK4rDx3O5572VAAxKqccIe+raGFPI+vXOcAJ169blww8/ZM2aNZYkConpRPHorLXsO5ZDnapJPHZNC7fDMcZEkAMHDjBq1ChatGjBggULALj66qupVMkKgRYWs01Pa3ceZubKXQD8Y1g7khNi9kc1xpykDz/8kDvuuIP9+/fz8MMP0759e7dDimgxe/R8eIZzK+wVzWtxUcPoGXLQGBNeo0aN4vXXX6ddu3Z89tlntG3b1u2QIl5MJop1uw6zKv0wAL/v2cTlaIwxbitYxO+SSy6hWbNm3HvvvcTFxeQhsNSFtY9CRHqLyCYR2SIiDxbxeQMR+UpEVojIahHpWxrbnbXKaXIa0K6elegwppzbtm0bvXr14o033gBg3LhxTJgwwZLESQhbohARL/AC0AdoDgwVkeaFFnsEeE9VLwSGAC+WxrY/XbMbgOva1S2N1RljopDf72fSpEm0bNmSxYsX519VmJMXziuK9sAWVU1V1RzgHaB/oWUUqBJ8XxXYdbob3XHgOGkHjlMh3kuHxlbLyZjyaMOGDXTp0oW77rqLbt26sW7dOkaNGuV2WFErnNdedYEdBabTgQ6FlnkMmCci/wNUBHoWtSIRGQeMA2jQoEGxG527zrma6HzemcR5Y/ruX2PMCWzZsoVNmzbx5ptvcsMNN1g1htMUziNpUf8zha/9hgKvqWo9oC/wpoj8JiZVnaKqKaqaUrNmzWI3Om/9HgB6t6x9SkEbY6LT8uXLmT59OuA8D7Ft2zZuvPFGSxKlIJyJIh2oX2C6Hr9tWroZeA9AVb8DkoAap7rBzBw/3287AMCl553yaowxUSQzM5MHH3yQDh068Oc//zm/iF+VKlVK+KYJVTgTxVKgiYg0FpEEnM7qWYWWSQN6AIhIM5xEsfdUN/jhD+kANDwzmbOrWiEvY2LdggULaNOmDU8//TSjRo1ixYoVVsQvDMLWR6GqPhEZD8wFvMB0VV0nIo8Dy1R1FnAv8IqI3I3TLDVKT+PWhMdnOzVbBl9cv4QljTHRbufOnfTo0YP69evz+eef06NHD7dDillhvZFYVecAcwrN+2OB9+uBzqWxrfSDx8nxBwBrdjImlq1Zs4ZWrVpRt25dZsyYQffu3alYsaLbYcW0mLkt6IPlTrPT2VWSaF2v/A4wYkys2rdvH8OHD6d169b5RfyuuuoqSxJlICYeTVRV3gqOhf1wv2YuR2OMKU2qyvvvv8/48eM5ePAgjz76KB06FL7T3oRTTCSKnYcy2Xs0G3CKABpjYsfIkSN58803SUlJ4YsvvqBVq1Zuh1TuxESiWL79IABdmtQgKd7rcjTGmNNVsIhft27daN26Nb///e+tPpNLYqKP4suNPwPQroGVEzcm2qWmptKzZ09ee+01AG6++Wbuu+8+SxIuiolE8XFwgKKURpYojIlWfr+f559/nlatWrF06VI8npg4PMWEqE/RWbn+/PcX2hWFMVFp/fr1jB49miVLltCvXz9efvll6tWr53ZYJijqE8W6XUcASIr3UCkx6n8cY8qlbdu2sXXrVt5++22GDBli9ZkiTNQfWbfvzwDgvLNsQHRjosnSpUtZuXIlY8eOpV+/fqSmplK5cmW3wzJFiPpGwJU7DgFw+flnuRyJMSYUx48f57777qNjx4489dRT+UX8LElErqhPFJt2HwWgbQN7GtuYSPf111/TunVrnnvuOcaOHWtF/KJE1Dc9/Tev6ammnY0YE8nS09O54ooraNiwIV9++SXdu3d3OyQToqi+ojialcueI9kkxHmoc4adlRgTiVatWgVAvXr1+Pjjj1m9erUliSgT1Yli3jpnNLumtSrZsKfGRJi9e/cybNgw2rZty/z58wHo27cvycnJLkdmTlZUNz2tTnc6suueUcHlSIwxeVSVd955hzvvvJPDhw/zpz/9iU6dOrkdljkNISWK4Ah1DVR1S5jjOSk/HXbulmjf+EyXIzHG5Bk+fDhvvfUWHTp0YNq0abRo0cLtkMxpKrG9RkT6AWuA/wSn24rIjHAHFoq0A8cBaFHHxsY1xk2BQCC/kF/37t2ZOHEiixYtsiQRI0Jp2H8c6AAcAlDVlcB54QwqFIGAsjF4a+w5NWzgEmPcsmXLFnr06MGrr74KOEX87r77brxeq+QcK0JJFLmqeqjQvFMe17q07D7iNDtVSYqjZuVEl6Mxpvzx+Xw8++yztGrVihUrVpCQkOB2SCZMQumj2CAigwCPiDQG7gIWhzeskqXudZ6fCChWF8aYMrZ27Vpuuukmli1bRv/+/XnxxRepU6eO22GZMAnlimI8cBEQAD4CsnCShas2/OQUA+zWtKbLkRhT/qSlpbF9+3beeecdZsyYYUkixoVyRXGlqk4AJuTNEJHrcJKGa47n+IOxuBmFMeXHkiVLWLVqFePGjaNv376kpqZSqZIV4ywPQrmieKSIeQ+XdiAna8dB546nS86t4XIkxsS2jIwM7rnnHjp16sQzzzxDdrYzPr0lifLjhFcUInIl0BuoKyITC3xUBacZylXfbtkHwFnWkW1M2Hz55ZeMHTuW1NRUbrvtNv7yl7+QmGh/c+VNcU1PPwNrcfok1hWYfxR4MJxBhaJG5UR2Hc4iOcFuwTMmHNLT07nyyitp3Lgx8+fPp2vXrm6HZFxywkShqiuAFSLylqpmlWFMIdl/LAeAOla+w5hStWLFCi688ELq1avH7Nmz6datGxUq2N9ZeRZKH0VdEXlHRFaLyOa8V9gjK8H+DKed1J6hMKZ07Nmzh8GDB9OuXbv8In69e/e2JGFCShSvAa8CAvQB3gPeCWNMJTqalUtWboDEOI81PRlzmlSV//u//6N58+bMnDmTJ554gksuucTtsEwECSVRJKvqXABV3aqqjwCuFpPfHSwGWPeMCvawnTGnadiwYQwfPpzzzz+flStX8vDDDxMfH+92WCaChPIcRbY4R+OtInIrsBNwdYDqfcH+ieoVrWSAMaciEAggIogIvXr1olOnTtxxxx1Wn8kUKZQriruBSsCdQGdgLDA6nEGV5NBxJ1FUs0RhzEnbvHkz3bt3Z/r06QDcdNNN3HnnnZYkzAmVeEWhqkuCb48CwwFEpF44gypJZq7zVHZF658wJmQ+n4+JEyfy6KOPkpSUZJ3UJmTFXlGIyMUicq2I1AhOtxCRN3C5KGBGsHxHBUsUxoRk9erVdOzYkQkTJtCnTx/Wr1/PsGHD3A7LRIkTJgoReQp4C7gB+ExEHga+AlYBTcsmvKLtO+rcGlulgnW4GROK9PR0duzYwfvvv8+HH35I7dq13Q7JRJHimp76A21UNVNEqgO7gtObQl25iPQG/g54gamq+pcilhkEPIYzxsUqVS3xNCdvZLsEbyhdLMaUT99++y2rV6/m1ltvzS/iV7GiDfJlTl5xR9osVc0EUNUDwMaTTBJe4AWcZy+aA0NFpHmhZZoADwGdVbUF8PtQ1p0U7zQ5xXksURhT2LFjx7jrrru49NJLee655/KL+FmSMKequCuKc0Qkr5S4AI0KTKOq15Ww7vbAFlVNBRCRd3CuUtYXWGYs8IKqHgyu8+dQgj6SlQtAoxrJoSxuTLkxb948xo0bR1paGnfccQdPPvmkFfEzp624RDGg0PQ/T3LddYEdBabTccbeLqgpgIgswmmeekxVPyu8IhEZB4wDaNCgAUezfABUSbI+CmPy7Nixg379+nHuueeyYMECLr30UrdDMjGiuKKAX5zmuot6ZLrwWNtxQBPgMqAe8I2ItCw8RreqTgGmAKSkpOjhTOeKolJSKM8LGhPbli9fzkUXXUT9+vWZM2cOXbp0ISkpye2wTAwJZyN/OlC/wHQ9nA7xwst8rKq5qroN2ISTOIq1YZczDGq1ZLuiMOXX7t27uf7660lJSckv4nfFFVdYkjClLpyJYinQREQai0gCMASYVWiZmQTrRgWf1WgKpJa04oA6FyaVrenJlEOqyuuvv07z5s2ZPXs2Tz75pBXxM2EVctuNiCSqanaoy6uqT0TGA3Nx+h+mq+o6EXkcWKaqs4Kf9RKR9YAfuF9V95e0bo9HIKBUtecoTDk0ZMgQ3nvvPTp37szUqVO54IIL3A7JxLgSE4WItAemAVWBBiLSBhijqv9T0ndVdQ4wp9C8PxZ4r8A9wVdIVCHHFyDeKyTG2e2xpnwoWMSvb9++dOnShdtvvx2P3SJuykAov2WTgKuA/QCqugoXy4z7CzQ7WYlxUx5s3LiRrl27Mm3aNABGjhzJ+PHjLUmYMhPKb5pHVbcXmucPRzCh8AecRFEh3uo8mdiWm5vLk08+SZs2bVi/fj2VKlVyOyRTToXSR7Ej2Pykwaet/wdwbSjUvI7snYcy3QrBmLBbuXIlN910EytXrmTgwIH84x//4Oyzz3Y7LFNOhZIobsNpfmoA7AE+D85zRSB4RZHSsJpbIRgTdrt372b37t18+OGHXHddSUUQjAmvUBKFT1WHhD2SEOX1UdjDdibWLFy4kNWrV3P77bfTu3dvtm7dSnKylakx7gulj2KpiMwRkZEiUjnsEZUgmCdItrEoTIw4evQo48ePp0uXLjz//PP5RfwsSZhIUWKiUNVzgSeAi4A1IjJTRFy7wtBgpkiMs0Rhot/cuXNp2bIlL774InfddRc//PCDFfEzESek++tU9VtVvRNoBxzBGdDIFcEuCnuGwkS9HTt2cNVVV5GcnMzChQt5/vnn7c4mE5FKPNqKSCURuUFEZgPfA3sB1+oF5N31lJxgfRQm+qgq33//PQD169fn008/ZcWKFVaCw0S0UE7L1wIdgWdU9TxVvVdVl4Q5rhPKyg0A1kdhos9PP/3EgAED6NChQ34Rv549e1oRPxPxQjktP0dVA2GPJERxXudp7L1HQy47ZYyrVJXXXnuNe+65h6ysLJ5++mk6d+7sdljGhOyEiUJEnlPVe4EPRaTwOBKhjHAXFnl3PZ13lrXlmugwaNAgPvjgA7p06cLUqVNp2rSp2yEZc1KKu6J4N/jvyY5sF1Z5dz3Fe63Ok4lcfr8fEcHj8XD11Vdz+eWXc8stt1h9JhOVTvhbq6rfB982U9UvCr6AZmUT3m/l3fUUb3c9mQi1YcMGunTpkl/Eb8SIEdx2222WJEzUCuU3d3QR824u7UBCle1z6hFKkSOtGuOe3NxcnnjiCdq2bcumTZuoWrWq2yEZUyqK66MYjDMqXWMR+ajAR5WBQ0V/K/zivU5u8wcipn/dGFasWMGoUaNYvXo1gwcPZtKkSZx11lluh2VMqSiuj+J7nDEo6gEvFJh/FFgRzqCKk9eZfVYVu6XQRI49e/awb98+Zs6cSf/+/d0Ox5hSdcJEoarbgG041WIjRrbPT0XsyWzjvgULFrBmzRruuOMOevfuzZYtW6hQoYLbYRlT6k54tBWR+cF/D4rIgQKvgyJyoOxCLBRXsG9Cf3PDrjFl48iRI9x+++1069aNSZMm5RfxsyRhYlVxp+V5w53WAGoWeOVNuyJv9NNqFRPcCsGUY3PmzKFFixZMnjyZe+65x4r4mXKhuNtj83qL6wNeVfUDnYBbgIplEFuRcv1OWEnx1vRkytaOHTvo378/VatW5dtvv+W5556jYkXX/hSMKTOhHG1n4gyDei7wBs4zFG+HNapi5I2ZnXf3kzHhpKosXrwYcIr4zZs3jx9++IEOHTq4HJkxZSeUo21AVXOB64DnVfV/gLrhDevEvB6n7amyjXBnwmzXrl1ce+21dOrUKb+IX/fu3UlIsGZPU76Ekih8InI9MBz4JDgvPnwhlRBM8IqiQrxVjzXhoapMnTqV5s2bM2/ePJ599lkr4mfKtVBOy0cDt+OUGU8VkcbAv8IbVsksUZhwGThwIB999BHdunVj6tSpnHfeeW6HZIyrSkwUqrpWRO4EzhORC4Atqvq/4Q+teHHWR2FKUcEiftdeey29evVi7NixVp/JGEIb4a4LsAWYBkwHNouIq9fhFW3QIlOK1q5dS+fOnfOL+A0fPtwqvRpTQCh/CX8D+qpqZ1W9BOgH/D28YRUvwZ7KNqUgJyeHP/3pT7Rr146tW7dSrVo1t0MyJiKF0keRoKrr8yZUdYOIuHrbx8HjuW5u3sSA5cuXM2rUKNauXcuwYcN4/vnnqVnTtedIjYlooSSKH0RkMvBmcPoGXCwKCFDFbo01p2n//v0cOnSI2bNnc9VVV7kdjjERLZQj7q3AncADgAALgH+EM6iSWOVYcyq++uor1qxZw5133kmvXr348ccfSUqy3yVjSlJsY7+ItAJ6AzNU9RpVvVpV/6qqWWUTXtHsqWxzMg4fPswtt9zC5ZdfzksvvZRfxM+ShDGhKa567B8vVk34AAAWoUlEQVRwynfcAPxHRIoa6c4VNl62CdXs2bNp3rw5U6dO5b777mP58uVWxM+Yk1Rc09MNQGtVzRCRmsAcnNtjXXcgI8ftEEwU2LFjBwMGDOCCCy5g5syZXHzxxW6HZExUKq4NJ1tVMwBUdW8Jy5apSonWmW2Kpqp8++23wC9F/JYtW2ZJwpjTUNzB/xwR+Sj4mgGcW2D6o2K+l09EeovIJhHZIiIPFrPcQBFREUkJZb21q1rbsvmt9PR0rrnmGjp37pxfxO+yyy6zIn7GnKbiTs0HFJr+58msWES8OGNtXwGkA0tFZFbBZzKCy1XGuatqSajrtgfuTEGBQIBXXnmF+++/H5/Px8SJE7n00kvdDsuYmFHcmNlfnOa62+PUhUoFEJF3gP7A+kLL/Rl4Brgv1BXvOZJ9mqGZWDJgwABmzpzJ5ZdfziuvvMI555zjdkjGxJRwnprXBXYUmE6n0DgWInIhUF9VP6EYIjJORJaJyDKA+tWTSztWE2V8Ph+BgDPa4YABA3jllVf4/PPPLUkYEwbhTBRF3cOq+R+KeHDqSN1b0opUdYqqpqhqCtigReXd6tWr6dSpE6+88goAN954I2PGjEHEbps2JhxCThQicrI3n6fjjLedpx6wq8B0ZaAl8LWI/BfoCMwKpUM7wR64K5eys7N59NFHueiii9i+fbvVZjKmjIRSZry9iKwBfgxOtxGRUEp4LAWaiEjjYBHBIcCsvA9V9bCq1lDVRqraCFgMXKOqy0pacZzHzhzLm6VLl9KuXTsef/xxhg4dyoYNG7juuuvcDsuYciGUNpxJwFU4T2mjqqtEpHtJX1JVn4iMB+YCXmC6qq4TkceBZao6q/g1nNjOQ5mn+lUTpQ4ePMixY8eYM2cOffr0cTscY8qVUBKFR1W3F2r/9YeyclWdg/NEd8F5fzzBspeFsk6A886qFOqiJop9+eWXrFmzhrvuuotevXqxefNmK79hjAtCaezfISLtARURr4j8Htgc5riK5bWmp5h26NAhxo4dS48ePZg8eXJ+ET9LEsa4I5REcRtwD9AA2IPT6XxbOIMqidfubolZH3/8Mc2bN2f69Ok88MADVsTPmAhQYtOTqv6M0xEdMbxWPTYmpaWlcf3119OsWTNmzZpFSkpIFV2MMWFWYqIQkVco8PxDHlUdF5aIQmB3PcUOVWXhwoV06dKFBg0a8Pnnn9OxY0erz2RMBAml6elz4IvgaxFwFuBqDQ2PNT3FhLS0NPr160fXrl3zi/h17drVkoQxESaUpqd3C06LyJvAf8IWUQiO54R005WJUIFAgJdffpkJEyagqkyaNMmK+BkTwU6lFkZjoGFpB3IybCjU6Hbdddfx8ccfc8UVVzBlyhQaNWrkdkjGmGKE0kdxkF/6KDzAAeCEY0uUBav1FH18Ph8ejwePx8PgwYPp378/o0aNsvpMxkSBYo+44vwVtwF2BmcFVPU3HdtlzfooosuqVasYPXo0Y8eO5dZbb2Xo0KFuh2SMOQnFtuEEk8IMVfUHX64nCQDLE9EhKyuLRx55hJSUFNLT0zn77LPdDskYcwpCacP5XkTaqeoPYY8mRJYnIt/333/PyJEj2bhxIyNHjmTixIlUr17d7bCMMafghIlCROJU1QdcCowVka1ABs5xWlW1XRnF+BvW9BT5jhw5QmZmJp999hlXXnml2+EYY05DcVcU3wPtgGvLKJbQWZ6ISPPmzWPdunXcfffd9OzZk02bNln5DWNiQHF9FAKgqluLepVRfEWyK4rIcvDgQW666SauvPJKpk2bZkX8jIkxxV1R1BSRe070oapODEM8IbE0ETk++ugj7rjjDvbu3ctDDz3EH//4R0sQxsSY4hKFF6hEBB6XPfa8XURIS0tjyJAhtGzZkjlz5nDhhRe6HZIxJgyKSxQ/qerjZRbJSZDIy13lhqqyYMECunXrRoMGDfjyyy/p0KED8fHxbodmjAmTEvsoIpF1Ubhj+/bt9OnTh8suuyy/iN+ll15qScKYGFdcouhRZlGcJCv7ULYCgQD//Oc/adGiBQsXLuQf//gHXbp0cTssY0wZOWHTk6oeKMtAToYNR1G2rr32WmbPns2VV17J5MmTadjQ1ZqQxpgyFpXV9ayPIvxyc3Pxer14PB6GDh3KwIEDGT58uF3NGVMOReX9Q3ZFEV4//PAD7du35+WXXwZg6NChjBgxwpKEMeVUVCYKO16FR2ZmJg899BDt27dn9+7d1K9f3+2QjDERICqbniL4hqyotXjxYkaOHMnmzZsZPXo0zz77LNWqVXM7LGNMBIjKROEPRES185iSkZFBbm4u//nPf+jZs6fb4RhjIkhUJopAZAyLEfU+++wz1q1bx7333kuPHj3YuHEjCQkJbodljIkwUdlHUSkxKvNbxNi/fz8jR46kT58+vP766+Tk5ABYkjDGFCkqE4V1UZwaVeWDDz6gefPmvP322zzyyCMsXbrUEoQxplhReWpuZcZPTVpaGsOGDaN169bMmzePNm3auB2SMSYKROUVhT1HETpV5csvvwSgYcOGfP311yxevNiShDEmZFGZKOzJ7NBs27aNXr160aNHj/wifpdccglxcVF5IWmMcUlUJgq7oiie3+/n73//Oy1btmTJkiW89NJLVsTPGHPKovPU0hJFsfr378+///1v+vbty8svv2xPWBtjTktUJgrrzP6tgkX8hg8fztChQxk2bJjVZzLGnLawNj2JSG8R2SQiW0TkwSI+v0dE1ovIahH5QkRCql9th75fW7ZsGSkpKbz00ksADB48mBtuuMGShDGmVIQtUYiIF3gB6AM0B4aKSPNCi60AUlS1NfAB8Ewo6/ZYJwXgFPGbMGECHTp0YO/evTZOhDEmLMJ5RdEe2KKqqaqaA7wD9C+4gKp+parHg5OLgXqhrNjSBHz33Xe0adOGZ555htGjR7N+/Xquuuoqt8MyxsSgcPZR1AV2FJhOBzoUs/zNwKdFfSAi44BxAAlnn2dNKjhXE4FAgM8//5wePSJ21FpjTAwIZ6Io6mheZDU/EbkRSAG6FfW5qk4BpgAk1m6i5TVPzJkzh3Xr1nH//fdz+eWXs2HDBuLj490OyxgT48LZ9JQOFLwvsx6wq/BCItITeBi4RlWzQ1lxebvrad++fdx4443069ePt956K7+InyUJY0xZCGeiWAo0EZHGIpIADAFmFVxARC4EJuMkiZ9DXXF5SROqyjvvvEOzZs147733ePTRR/n++++tiJ8xpkyFrelJVX0iMh6YC3iB6aq6TkQeB5ap6izgr0Al4P1gv0Oaql5T0rrLyxVFWloaI0eOpE2bNkybNo1WrVq5HZIxphwSjbJBgBJrN9Hly5bRsm5Vt0MJC1Xliy++yB9lbvHixVx88cV4vV6XIzPGRDMRWa6qKafy3ais9eSL0aFQt27dSo8ePbjiiivyi/h17NjRkoQxxlVRmSgS46Iy7BPy+/1MnDiRVq1asXz5ciZPnmxF/IwxESMqaz3FWhfF1VdfzaeffspVV13FSy+9RL16IT13aIwxZSI6E0UM3PeUk5NDXFwcHo+HUaNGMXz4cIYMGWIPExpjIk5steFEie+//56LLrqIF198EYBBgwYxdOhQSxLGmIgUlYkiWo+nx48f595776VTp04cPHiQc8891+2QjDGmRFHa9BR9Fi5cyMiRI0lNTeWWW27h6aefpmrV2LzF1xgTW6IzUURhpsgbWOirr77isssuczscY4wJWVQmimgxe/ZsNmzYwAMPPED37t1Zv349cXG2y40x0SUq+ygivfFp7969DBs2jGuuuYZ//etf+UX8LEkYY6JRVCaKSG16UlXefvttmjVrxgcffMDjjz/OkiVLrIifMSaqReUpboTmCdLS0rjpppu48MILmTZtGi1atHA7JGOMOW1ReUURSQKBAHPnzgWgYcOGfPPNNyxatMiShDEmZkRlooiUB9N+/PFHLr/8cnr37s2CBQsAaN++vRXxM8bElOhMFC5v3+fz8de//pXWrVuzcuVKpk2bZkX8jDExKzr7KFzOFFdddRVz586lf//+vPjii9SpU8fdgIwxJoyiMlG4ITs7m/j4eDweD2PGjGH06NFcf/31EdMMZowx4RKlTU9le3BevHgx7dq144UXXgBg4MCBDBo0yJKEMaZciM5EUUbH54yMDO6++24uueQSjh49SpMmTcpmw8YYE0Gs6ekEvvnmG0aOHMm2bdu4/fbbeeqpp6hSpYrbYRljTJmzRHECPp+P+Ph45s+fT9euXd0OxxhjXBOViSJcTU8zZ85kw4YNPPTQQ3Tv3p1169ZZfSZjTLkXpX0UpZsp9uzZw6BBg/jd737HBx98YEX8jDGmgKhMFKVFVXnzzTdp3rw5H3/8Mf/7v//L4sWLrYifMcYUEJWnzKV1PZGWlsaYMWNISUlh2rRpXHDBBaW0ZmOMiR1ReUVxOi1PgUCATz/9FHCK+C1atIgFCxZYkjDGmBOIzkRxitcUmzdv5rLLLqNv377Mnz8fgJSUFCviZ4wxxYjKRHGyfD4fTz/9NK1bt2bNmjW8+uqrdsurMcaEKDr7KE7ygqJfv37MmzeP6667jhdeeIGzzz47PIEZY0wMElV1O4aTkli7ie7YtIazqiQVu1xWVhbx8fF4vV4+/PBDAAYMGFAWIRpjTMQRkeWqmnIq343OpqcSrigWLVpE27Zt84v4DRgwwJKEMcacouhMFCdw7Ngx7rzzTrp06UJWVhbNmjVzOyRjjIl60dlHUcQlxfz58xk5ciRpaWmMHz+eJ598kkqVKrkQnTHGxJboTBQnaHpKTk7mm2++oXPnzmUbkDHGxLDoTBTBfz/66CM2btzIH/7wB7p168aaNWvsmQhjjCllYe2jEJHeIrJJRLaIyINFfJ4oIu8GP18iIo1CWe+ePbsZOHAgAwYMYMaMGflF/CxJGGNM6QtbohARL/AC0AdoDgwVkeaFFrsZOKiq5wF/A54uab3+40e4JKUtn3zyCU899RTffvutFfEzxpgwCucVRXtgi6qmqmoO8A7Qv9Ay/YHXg+8/AHpICTXE/Uf20qxZC1atWsWDDz5IfHx8qQdujDHmF+Hso6gL7CgwnQ50ONEyquoTkcPAmcC+gguJyDhgXHAye/F3i9ZaET8AalBoX5Vjti9+YfviF7YvfnH+qX4xnImiqCuDwo+Bh7IMqjoFmAIgIstO9enCWGP74he2L35h++IXti9+ISLLTvW74Wx6SgfqF5iuB+w60TIiEgdUBQ6EMSZjjDEnKZyJYinQREQai0gCMASYVWiZWcDI4PuBwJcabcWnjDEmxoWt6SnY5zAemAt4gemquk5EHgeWqeosYBrwpohswbmSGBLCqqeEK+YoZPviF7YvfmH74he2L35xyvsi6qrHGmOMKVsxVRTQGGNM6bNEYYwxplgRmyjCVf4jGoWwL+4RkfUislpEvhCRhm7EWRZK2hcFlhsoIioiMXtrZCj7QkQGBX831onI22UdY1kJ4W+kgYh8JSIrgn8nfd2IM9xEZLqI/Cwia0/wuYjIpOB+Wi0i7UJasapG3Aun83srcA6QAKwCmhda5nbg5eD7IcC7bsft4r7oDiQH399WnvdFcLnKwAJgMZDidtwu/l40AVYA1YLTZ7kdt4v7YgpwW/B9c+C/bscdpn3RFWgHrD3B532BT3GeYesILAllvZF6RRGW8h9RqsR9oapfqerx4ORinGdWYlEovxcAfwaeAbLKMrgyFsq+GAu8oKoHAVT15zKOsayEsi8UqBJ8X5XfPtMVE1R1AcU/i9YfeEMdi4EzRKR2SeuN1ERRVPmPuidaRlV9QF75j1gTyr4o6GacM4ZYVOK+EJELgfqq+klZBuaCUH4vmgJNRWSRiCwWkd5lFl3ZCmVfPAbcKCLpwBzgf8omtIhzsscTIHLHoyi18h8xIOSfU0RuBFKAbmGNyD3F7gsR8eBUIR5VVgG5KJTfizic5qfLcK4yvxGRlqp6KMyxlbVQ9sVQ4DVVfU5EOuE8v9VSVQPhDy+inNJxM1KvKKz8xy9C2ReISE/gYeAaVc0uo9jKWkn7ojLQEvhaRP6L0wY7K0Y7tEP9G/lYVXNVdRuwCSdxxJpQ9sXNwHsAqvodkIRTMLC8Cel4UlikJgor//GLEvdFsLllMk6SiNV2aChhX6jqYVWtoaqNVLURTn/NNap6ysXQIlgofyMzcW50QERq4DRFpZZplGUjlH2RBvQAEJFmOIlib5lGGRlmASOCdz91BA6r6k8lfSkim540fOU/ok6I++KvQCXg/WB/fpqqXuNa0GES4r4oF0LcF3OBXiKyHvAD96vqfveiDo8Q98W9wCsicjdOU8uoWDyxFJF/4TQ11gj2xzwKxAOo6ss4/TN9gS3AceCmkNYbg/vKGGNMKYrUpidjjDERwhKFMcaYYlmiMMYYUyxLFMYYY4plicIYY0yxLFGYiCMifhFZWeDVqJhlG52oUuZJbvPrYPXRVcGSF+efwjpuFZERwfejRKROgc+mikjzUo5zqYi0DeE7vxeR5NPdtim/LFGYSJSpqm0LvP5bRtu9QVXb4BSb/OvJfllVX1bVN4KTo4A6BT4bo6rrSyXKX+J8kdDi/D1gicKcMksUJioErxy+EZEfgq9LilimhYh8H7wKWS0iTYLzbywwf7KIeEvY3ALgvOB3ewTHMFgTrPWfGJz/F/llDJBng/MeE5H7RGQgTs2tt4LbrBC8EkgRkdtE5JkCMY8SkX+cYpzfUaCgm4i8JCLLxBl74k/BeXfiJKyvROSr4LxeIvJdcD++LyKVStiOKecsUZhIVKFAs9OM4LyfgStUtR0wGJhUxPduBf6uqm1xDtTpwXINg4HOwfl+4IYStn81sEZEkoDXgMGq2gqnksFtIlId+B3QQlVbA08U/LKqfgAswznzb6uqmQU+/gC4rsD0YODdU4yzN06ZjjwPq2oK0BroJiKtVXUSTi2f7qraPVjK4xGgZ3BfLgPuKWE7ppyLyBIeptzLDB4sC4oH/hlsk/fj1C0q7DvgYRGpB3ykqj+KSA/gImBpsLxJBZykU5S3RCQT+C9OGerzgW2qujn4+evAHcA/cca6mCoi/wZCLmmuqntFJDVYZ+fH4DYWBdd7MnFWxClXUXCEskEiMg7n77o2zgA9qwt9t2Nw/qLgdhJw9psxJ2SJwkSLu4E9QBucK+HfDEqkqm+LyBKgHzBXRMbglFV+XVUfCmEbNxQsICgiRY5vEqwt1B6nyNwQYDxw+Un8LO8Cg4CNwAxVVXGO2iHHiTOK21+AF4DrRKQxcB9wsaoeFJHXcArfFSbAf1R16EnEa8o5a3oy0aIq8FNw/IDhOGfTvyIi5wCpweaWWThNMF8AA0XkrOAy1SX0McU3Ao1E5Lzg9HBgfrBNv6qqzsHpKC7qzqOjOGXPi/IRcC3OGAnvBuedVJyqmovThNQx2GxVBcgADotILaDPCWJZDHTO+5lEJFlEiro6MyafJQoTLV4ERorIYpxmp4wilhkMrBWRlcAFOEM+rsc5oM4TkdXAf3CaZUqkqlk41TXfF5E1QAB4Geeg+0lwffNxrnYKew14Oa8zu9B6DwLrgYaq+n1w3knHGez7eA64T1VX4YyPvQ6YjtOclWcK8KmIfKWqe3HuyPpXcDuLcfaVMSdk1WONMcYUy64ojDHGFMsShTHGmGJZojDGGFMsSxTGGGOKZYnCGGNMsSxRGGOMKZYlCmOMMcX6f/+il0JFnJoCAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)\n",
    "\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('False Positive Rate')\n",
    "    plt.ylabel('True Positive Rate')\n",
    "\n",
    "plot_roc_curve(fpr, tpr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过观察 ROC 曲线很容易判断分类器的效果，曲线越贴近左上角越好，曲线包围的面积越大越好。ROC 曲线可以观察出分类器对样本的区分程度，如果分类器对所有正样本的评分大于负样本，阈值在由小到大变化的时候，召回率一直为 1，此时 ROC 曲线的面积为 1。如果分类器乱猜一气，那么猜对的和猜错的几乎对半分，此时 ROC 曲线就是上图中 45° 的虚线那样。\n",
    "\n",
    "\n",
    "使用 `roc_auc_score` 能计算出曲线下面积（AUC, area under the curve）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9596933795449549"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了比较不同分类器的效果，这里训练一个 `RandomForestClassifier` 分类器，来与 SGD 对比。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fec78647278>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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wNWpUN99Fy63vxmTi0VFRdGjRw+ioqJo164d7733HqVKlXI7LJNHeZMoHsLpfroW+BOY53nNGOMjBw4c4MCBA3z99de0aZNREQRjfMubwezLPLWecoTgqyrodf/ZyNAngrn/frejMSbrLF26lA0bNtCvXz8ATp8+TUHrYzVZxNeD2atEZLaIdBORIpnZSFarVAkuv9ztKIzJGidOnGDAgAE0btyYd955J6mInyUJk1N4M8Pd9cBLQC0gWkSmi4ir90V/9BG0bOlmBMZkjTlz5lC1alU++OADHn30UdauXWtF/EyO49X1daq6TFUfAWoCx4FPfRqVMXnAvn37uPPOOylYsCBLly7lnXfesSubTI6UYaIQkcIi0kVEZgErgUOAq/UCateGhQvdjMCYzFFVVq5cCcA111zD999/z7p166wEh8nRvDmj2AjUA95Q1RtUdaCqrvBxXOmKiIDLLnMzAmMu3h9//EHbtm2pW7duUhG/W265xYr4mRzPm8tjr1PVHFVZadQou4/C+A9VZcKECTzxxBPExsby+uuv07BhQ7fDMsZrF0wUIvK2qg4EvhaRf11D68UMd8YY4N577+Wrr76icePGfPTRR9x4441uh2TMRUnvjOILz78XO7Odz4WFwbzvnMtkjcmJ4uPjERECAgJo1aoVN998Mw8++KDVZzJ+6YK/taq60vO0sqrOT/kAKmdPeGmLjISiRd2MwJgL27JlC40bN04q4nf//ffz0EMPWZIwfsub39yeabz2QFYHcjHeeQeuvtrNCIz5t/Pnz/PSSy8RHh7O1q1bKVasmNshGZMl0huj6IAzK115EfkmxVtFgKNpf8qYvGndunV0796dDRs20KFDB0aMGMGVV17pdljGZIn0xihW4sxBUQYYmeL1E8A6XwaVkYoVYdcW634yOceff/7JX3/9xfTp02ndurXb4RiTpS6YKFT1N+A3nGqxOco994Bdem7ctmTJEqKjo+nfvz+33347O3bsoECBAm6HZUyWu+AYhYgs9vx7RET+TvE4IiKuVpN97TXIn9/NCExedvz4cfr160eTJk0YMWJEUhE/SxImt0pvMDtxutOSwBUpHoltY/Kc2bNnU6VKFT788EOeeOIJK+Jn8oT0Lo9NvBv7GiBQVeOB+sCDQKFsiO2CatRwc+smr9q3bx+tW7emWLFiLFu2jLfffptChVz9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JokTCy1cuJDRo0dbkjB+pWlTmDDBeX7+vNP+5BOnffq00/7iC6d97JjT/uYbp/3XX0571iynfeCAd9v8448/KFmyJMHBwQCULFmS4sWLM3bsWN577z1CQkIAKFKkCMOGDUtzHVdeeSVjxozh/fffx9/uGctJLFH40KxZs3jjDWeKjcjISDZv3kzTpk3dDcoYP3Hbbbexb98+brzxRvr168fixYvZsWMH1157LUWKFPF6Pddddx0JCQkcPGhVgjLLup584NChQzz66KN8/vnnhIeH89hjj5E/f37y5bPdbfzTokXJz4OC/tkuWPCf7WLF/tkuWfKf7VKlvNtm4cKFWbNmDT/99BMLFy6kQ4cOPPXUU/9Y5uOPP+bdd9/l8OHDLFu27ILzw9vZxKWxM4ospKp89tlnVK5cma+++ooXX3yRFStWWBE/YzIpMDCQpk2b8sILL/D+++8za9Ys9u7dy4kTJwDo0aMHUVFRFCtWjPj4+DTXsWvXLgIDA7nyyiuzM/RcxRJFFtq7dy89evTghhtuYN26dTz77LOWJIzJpK1bt7J9+/akdlRUFBUrVuSBBx5gwIABSeVF4uPjk0rvp3bo0CH69u3LgAED7PLzS2B9IZcoISGBH3/8kebNm1O2bFl++uknatWqZUX8jLlEJ0+e5OGHH+bo0aPky5ePG264gTFjxlCsWDGeffZZqlatSpEiRShQoADdunXj6quvBpzZH8PDwzl//jz58uWja9euPPHEEy7/NP7Nqsdegu3bt9O7d28WL17M4sWLuemmm9wOyZgssWXLFipXrux2GCaT0vr/u5Tqsdb1lAlxcXG8+eabVK9enaioKMaNG2dF/IwxuZZ1PWXCnXfeyZw5c2jdujUffPBB0imvMcbkRpYovHT27FmCgoIICAigV69e9OzZk/bt29sAmTEm17OuJy8sX76cmjVrMnLkSADatWvHvffea0nCGJMnWKJIx6lTp3j88cdp0KABJ06coEKFCm6HZIwx2c66ni7gp59+olu3bvz222/069ePV199laJFi7odljHGZDs7o7iAuLg4goKCWLx4MSNHjrQkYUw2SywXXrVqVVq1asXRo0ezZL27d++matWqWbKulIYNG0bp0qWTSp8/+eSTWb6NRFFRUcyePdtn60/NEkUK06dP59VXXwWcIn6bNm2yeyOMcUliufCNGzdy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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "forest_clf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=5, method='predict_proba', n_jobs=-1)\n",
    "\n",
    "y_scores_forest = y_probas_forest[:,1]\n",
    "fpr_forset, tpr_forest, thresholds_forest = roc_curve(y_train_5, y_scores_forest)\n",
    "\n",
    "# SGD 的 ROC 曲线\n",
    "plt.plot(fpr, tpr, \"b:\", label='SGD')\n",
    "\n",
    "# RandomForest 的 ROC 曲线\n",
    "plot_roc_curve(fpr_forset, tpr_forest, label=\"Random Forest\",)\n",
    "plt.legend(loc='lower right')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 观察 RandomForest 的精度和召回率曲线\n",
    "precisions_forest, recalls_forest, thresholds_forest = precision_recall_curve(y_train_5, y_scores_forest)\n",
    "\n",
    "plot_precision_vs_recall(precisions_forest, recalls_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9986528972746693"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到 roc_auc 达到了 99.86%，且 precision 和 recall 曲线更加贴近右上角，分类取得了不错的效果。如果取 recall 为 90%，那么精度也能达到 95% 以上。看来 `RandomForest` 分类器的分类效果较 `SGD` 要好（这很自然）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多分类\n",
    "\n",
    "多分类任务，可以使用二分类分类器来完成，通过采用 1 对多 或者 1 对 1 的策略训练多个分类器，并将这些分类器组合成一个多分类器。\n",
    "\n",
    "对于 N 分类任务，如果采用 1 对 1 的策略，需要训练 N(N-1) 个分类器，但是每次训练只在两类样本上进行，训练的速度会更快。而 1 对多，需要训练 N 个分类器，但每次都是在全部样本上来进行的，训练速度常常慢于 1 对 1。\n",
    "\n",
    "在 Scikit-Learn 中，如果使用二分类分类器来进行多分类，除了 SVM 外，会自动使用 1 对多的策略。如果要强制使用某种策略，可以使用 `OneVsOneClassifier` 或者 `OneVsRestClassifier` 这两个类："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42, max_iter=100, tol=0.01))\n",
    "\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "\n",
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里使用 1 对 1 的策略，共训练了 `10*9=45` 个分类器来完成分类任务。对于随机森林分类器，它本身就是多分类分类器，所以无需采用 1 对 1 或者 1 对多 的策略。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0.  , 0.  , 0.01, 0.02, 0.  , 0.  , 0.01, 0.  , 0.96, 0.  ]]), 8.0)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.fit(X_train, y_train)\n",
    "\n",
    "(forest_clf.predict_proba([X_train[1]]), y_train[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在随机森林分类器上调用 `predict_proba` 可以得出某个样本在被分到各个类别上的概率，可以取概率最大的类，将样本分到某一类，也可以取概率最高的前 2 类，将样本分到两个类别中。上面给出的样本是实际是 8 ，而预测结果显示样本为 8 的概率为 96%。\n",
    "\n",
    "### 对数据做预处理能够提升分类效果\n",
    "\n",
    "对数据不做任何处理，使用 SGDClassifier 做多分类得到的平均精度大约为 `86%`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.85422741, 0.86885519, 0.85066667, 0.87005085, 0.87762588])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将样本做一些预处理，常常能够很轻易地提升准确率。因为手写数字图片中数字的颜色深浅不同，可将其做标准化后，消除颜色差异的影响。`StandardScaler` 的做法是将样本的各个维度减去均值，然后除以标准差。如此以来样本的所有属性的值都落在了 0~1 之间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.91578509, 0.9095984 , 0.91375   , 0.90947737, 0.91222074])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=5, scoring='accuracy')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "做了数据预处理后，准确率提升了 4 个百分点。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 误分类分析\n",
    "\n",
    "使用 confusion matrix 对多分类器的分类的结果进行分析，可以看出容易分错的样本类型，以及容易被误分到哪一类，由此可采取合理的手段来改进。\n",
    "\n",
    "confusion_matrix 返回的是一个矩阵，可以将此矩阵传入 matshow 绘制出来，便于直观地观察。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7fec781b3400>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAECCAYAAADesWqHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAACwBJREFUeJzt3c2L3fUVx/HPJzMT8mBFQ7txRhKVYitKjQz1IeDCuGhr0E0XVhTqJptWowii3fgPiOiiCEOsG4MuYhYlFmtBXXQTMk7EMRkrojYPRkwJVRF0nk4X9wpq0rm/wXvub67n/QIhM16/HK555z7kd884IgSglnVtDwBg8AgfKIjwgYIIHyiI8IGCCB8oqLXwbf/K9r9sv2f7kbbmaMr2pbZfsz1n+6jtPW3P1ITtEdtHbB9se5YmbF9ke7/td7r39Y1tz9SL7Qe7vyfetv287Q1tz9RLK+HbHpH0Z0m/lnSVpN/ZvqqNWVZhUdJDEfFzSTdI+sMQzCxJeyTNtT3EKjwl6eWI+JmkX2iNz257XNL9kiYj4mpJI5LubHeq3tp6xP+lpPci4v2ImJf0gqQ7WpqlkYg4HREz3V9/rs5vyPF2p1qZ7QlJt0na2/YsTdi+UNLNkp6RpIiYj4j/tjtVI6OSNtoelbRJ0kctz9NTW+GPSzrxja9Pao1H9E22t0naLulQu5P09KSkhyUttz1IQ5dLOiPp2e7Lk722N7c91Eoi4pSkxyUdl3Ra0qcR8Uq7U/XWVvg+z/eG4tph2xdIelHSAxHxWdvz/D+2d0n6JCLeaHuWVRiVdJ2kpyNiu6QvJK3p939sX6zOs9XLJF0iabPtu9udqre2wj8p6dJvfD2hIXh6ZHtMnej3RcSBtufpYYek221/qM5LqVtsP9fuSD2dlHQyIr5+JrVfnT8I1rJbJX0QEWciYkHSAUk3tTxTT22Ff1jST21fZnu9Om+G/LWlWRqxbXVee85FxBNtz9NLRDwaERMRsU2d+/fViFjTj0QR8bGkE7av7H5rp6RjLY7UxHFJN9je1P09slNr/A1JqfPUauAiYtH2HyX9XZ13Qf8SEUfbmGUVdki6R9Ks7Te73/tTRPytxZl+iO6TtK/7gPC+pHtbnmdFEXHI9n5JM+r8zc8RSVPtTtWb+VguUA9X7gEFET5QEOEDBRE+UBDhAwW1Hr7t3W3PsBrDNq/EzIMwbPO2Hr6kobrDNHzzSsw8CEM171oIH8CApVzAs2XLlpiYmGh027Nnz2rLli2Nbjs7O/t9xgJKiIjzfQjuW1Iu2Z2YmNDBg/1f+LJ169a+n4lzdS45Hy5ZV6CuW5f3pHh5ub1PS/NUHyiI8IGCCB8oiPCBgggfKKhR+MO2Ax/AynqGP6Q78AGsoMkj/tDtwAewsibhD/UOfADnahJ+ox34tnfbnrY9ffbs2e8/GYA0TcJvtAM/IqYiYjIiJpteew+gHU3CH7od+ABW1vNDOkO6Ax/AChp9Oq/7QyP4wRHADwRX7gEFET5QEOEDBRE+UBDhAwWlLNu0nbIALfMn+2btVhvGn0actXNvGO+L0dG8nyS/uLiYcm6TZZs84gMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UFDa7uCMFc1ZK7Al6a233ko599prr005N9PS0lLKuSMjIynnSnmruzNnzlqv3QSP+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBPcO3fant12zP2T5qe88gBgOQp8kFPIuSHoqIGds/kvSG7X9ExLHk2QAk6fmIHxGnI2Km++vPJc1JGs8eDECeVb3Gt71N0nZJhzKGATAYja/Vt32BpBclPRARn53n3++WtLuPswFI0ih822PqRL8vIg6c7zYRMSVpqnv7nE9MAOiLJu/qW9IzkuYi4on8kQBka/Iaf4ekeyTdYvvN7j+/SZ4LQKKeT/Uj4p+S+v/hegCt4co9oCDCBwoifKAgwgcKInygIGdsJ7UdGVt2M42O5iwcnpmZSTlXkq655pqUczdu3Jhy7pdffplybqaxsbG0szO2GS8tLSkiesbHIz5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwWlrdfu+6HJstaBZ9y/X5udnU05N2tt97p1eY8zWffzyMhIyrlZZ8/Pz2t5eZn12gDORfhAQYQPFET4QEGEDxRE+EBBhA8U1Dh82yO2j9g+mDkQgHyrecTfI2kuaxAAg9MofNsTkm6TtDd3HACD0PQR/0lJD0taTpwFwID0DN/2LkmfRMQbPW632/a07em+TQcgRZNH/B2Sbrf9oaQXJN1i+7nv3igipiJiMiIm+zwjgD7rGX5EPBoRExGxTdKdkl6NiLvTJwOQhr/HBwoaXc2NI+J1Sa+nTAJgYHjEBwoifKAgwgcKInygIMIHCkrbspuxUTVzY22W9evXp529sLCQcu5LL72Ucu6uXbtSzpWk5eWcq8kz//8tLi72/cylpSVFBFt2AZyL8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oKG3Lrt1z0eeqZW7ZzZhXGs6ZMzYkS9K7776bcq4kXXHFFSnnZt0XUt5mYLbsAjgvwgcKInygIMIHCiJ8oCDCBwoifKCgRuHbvsj2ftvv2J6zfWP2YADyjDa83VOSXo6I39peL2lT4kwAkvUM3/aFkm6W9HtJioh5SfO5YwHI1OSp/uWSzkh61vYR23ttb06eC0CiJuGPSrpO0tMRsV3SF5Ie+e6NbO+2PW17us8zAuizJuGflHQyIg51v96vzh8E3xIRUxExGRGT/RwQQP/1DD8iPpZ0wvaV3W/tlHQsdSoAqZq+q3+fpH3dd/Tfl3Rv3kgAsjUKPyLelMRTeOAHgiv3gIIIHyiI8IGCCB8oiPCBgggfKChtvXbfD02WtUZ5GNdrZ619znTq1KmUc8fHx1POlaQNGzb0/cyvvvpKy8vLrNcGcC7CBwoifKAgwgcKInygIMIHCiJ8oCDCBwoifKAgwgcKInygIMIHCiJ8oCDCBwoifKAgwgcKInygIMIHCiJ8oCDCBwoifKCgtC27GRtgR0ZG+n7m17I2y2bOvLCwkHLu2NhYyrmLi4sp50p524ynp6dTzpWk66+/vu9nLi0tKSLYsgvgXIQPFET4QEGEDxRE+EBBhA8URPhAQY3Ct/2g7aO237b9vO3+/5hPAAPTM3zb45LulzQZEVdLGpF0Z/ZgAPI0fao/Kmmj7VFJmyR9lDcSgGw9w4+IU5Iel3Rc0mlJn0bEK9mDAcjT5Kn+xZLukHSZpEskbbZ993lut9v2tO28i5sB9EWTp/q3SvogIs5ExIKkA5Ju+u6NImIqIiYjYrLfQwLorybhH5d0g+1N7nzkbqekudyxAGRq8hr/kKT9kmYkzXb/m6nkuQAkGm1yo4h4TNJjybMAGBCu3AMKInygIMIHCiJ8oCDCBwoifKCgoVqvPYzWrcv7szVrdXfW2u6sFdiStGFDzifFM1eCHz58uO9n3nXXXTp27BjrtQGci/CBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKChry+4ZSf9uePMfS/pP34fIM2zzSsw8CGtl3q0R8ZNeN0oJfzVsT0fEZKtDrMKwzSsx8yAM27w81QcKInygoLUQ/lTbA6zSsM0rMfMgDNW8rb/GBzB4a+ERH8CAET5QEOEDBRE+UBDhAwX9DzEhs1NuHpazAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=5)\n",
    "\n",
    "conf_mat = confusion_matrix(y_train, y_train_pred)\n",
    "\n",
    "plt.matshow(conf_mat, cmap=plt.cm.gray)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从图中可以看到，主对角线上呈亮白色，说明大部分样本都分类正确了。为了观察分类错误的样本，需要让主对角线以外的块能够显示的更明显一些。可取的做法是求出每个块在该行的占比，即某个类别分其他各类的比重，然后将主对角置零，如此以来就能明显地看到错分的情况了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7fec78176b70>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "row_sums = conf_mat.sum(axis=1, keepdims=True)\n",
    "norm_conf_mat = conf_mat / row_sums\n",
    "\n",
    "np.fill_diagonal(norm_conf_mat, 0)\n",
    "\n",
    "plt.matshow(norm_conf_mat, cmap=plt.cm.gray)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上图能够看到 `5->3`, `3->5`, `7->9`, `5->8` 这是几个容易错分的类别组合。\n",
    "\n",
    "把数字 3 和 5 的图片挑出来一部分，进行观察："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "\n",
    "plt.figure(figsize=(5,5))\n",
    "plt.subplot(221); plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223); plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); plot_digits(X_bb[:25], images_per_row=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "其中副对角线上位为错分的图片，可以看出他们还是有很明显的特征的，但是分错了。这是因为这里采用了很简单的 SGD 分类器，这个分类器就是简单地对各个像素点上的值进行了一个线性加权求和，然后使用梯度下降的方法求合适的权重。这个模型采用的提取特征的方式太简陋，因此面对 3 和 5 这样的在像素点分布差不太多的类别时，就容易出错。\n",
    "\n",
    "采用其他能够更好地提取特征的模型，可能能够提升分类效果。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
